package com.example.demo.controller;

import com.example.demo.bean.User;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class RedisController {
    @Autowired
    private RedisTemplate redisTemplate;//这个是默认的RedisTemplate,为了序列化我们可以写一个自己的RedisTemplate!!
    //底层的时候redis定义了如果有和redisTemplate重名时用后者声明的一个,所以现在引入的这个就是我们自己写的了
    @RequestMapping("/redis")//测试普通set,get
    @ResponseBody
    public String redistest(){
        //opsForValue 操作字符串
        //opsForList  操作list
        //opsForSer
        //opsForHash
        //opsForGeo
        //opsForZset
        //opsForBitmap

        //获取redis连接对象
        // RedisConnection connection=redisTemplate.getConnectionFactory().getConnection();
        // connection.flushDb();
        // connection.flushAll();
        //因为这样反复写太麻烦了，所以后续我们写一个自己的util封装这些方法。
        redisTemplate.opsForValue().set("k1","v1");
        String a= (String) redisTemplate.opsForValue().get("k1");
        return a;
    }

    @RequestMapping("/redis2")//测试bean实体存取
    //测试结果，如果没有自定义redistemplate，即便序列化之后存入的user名字也变成了\xac\xed\x00\x05t\x00\x04user
    //如果自定义了redistemplate,序列化之后user名字还是user
    @ResponseBody
    public String redistest2() throws JsonProcessingException {
        User user=new User("dqq","'123");
        String userjson=new ObjectMapper().writeValueAsString(user);//类似于tostring，把数据转成json格式!
        redisTemplate.opsForValue().set("user",userjson);
        //如果直接存user对象的话会报序列化错误,所以这里我们给user序列化成json的格式,存入时容易把key转义成其他名字
        //同时也可以在pojo里对象序列化->jdk序列化，而且存入时容易把key转义成其他名字，如果不想用就看下一种方法
        //也可以写一个配置类，用于以后各种类型的序列化见config下以及对应rediscontrollermyredistemplate
        String user2string= (String) redisTemplate.opsForValue().get("user");
        return user2string;
    }
}
